package com.thp.singleton;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 懒汉单例  保证线程安全
 * @author Tommy
 *
 */
public class Singleton2 {
	
	
		
		// private static  AtomicInteger count = new AtomicInteger(0);
		private static int count = 0;
	
		// 这里可以不使用原子类 因为这个构造方法被外面的getInstance()方法套住了
		// getInstance是同步方法  线程安全的
		/*private Singleton2() {
			 System.out.println("Singleton 私有的构造方法被实例化 " + (count.incrementAndGet()) + " 次。");
		}*/
		
		//1、第一步先将构造方法私有化
		private Singleton2() {
			System.out.println("Singleton 私有的构造方法被实例化 " + (++count) + " 次。");
		}
		//2、然后声明一个静态变量保存单例的引用
		private static Singleton2 single=null;
		//为了保证多线程环境下正确访问，给方法加上同步锁synchronized
		//慎用  synchronized 关键字，阻塞，性能非常低下的
		//加上synchronized关键字以后，对于getInstance()方法来说，它始终单线程来访问
		//没有充分利用上我们的计算机资源，造成资源的浪费
		public static synchronized Singleton2 getInstance() {
			if (single == null) {
				single = new Singleton2();
			}
			return single;  
		}
	
	
	
}
